原帖 | Jack | 2024-11-18 15:37 | 👍1 | 阅读约1
数据缓冲与解包:
以串口为例:
分显示双buffer和隐式双buffer,那么什么是显式双buffer呢?就是你需要有两个独立的缓冲区。那么,每次数据全满以后,他就会去切换那个缓冲区。那么隐式双buffer的话就只有一个缓冲区,当他半满时,他就去通知线程解包。
往往,显式双Buffer需要配合Normal然后在全满里进行切换Buffer,并通知线程解包。
如果是隐式双buffer,则使用半满终中断和全满中断和circular模式,实现同一个buffer上的这种前后半段复用。
然后,根据解包的地点又分为,原地解包和异地解包,原地解包的好处是,数据在哪,就在哪原地拆包,并不需要再把数据拷贝出来,即,DMA搬运的目标地址区域和解包的地点区域一致。异地解包则需要把数据及时拷贝(DMA)出来到另一个地方进行解包。
原地解包的好处是,中断处理时间短,指针快速切换,但是数据快的话还是会覆盖还没解包的数据(取决于解包线程的速度)。
异地解包的好处是,通过DMA把未解包数据提前拿走,这样新的数据不会覆盖,对解包线程的优先级和实时性要求没那么苛刻,但是这样会使用较大空间,同时也要使用DMA去搬运数据。(配套双 buffer 串口 Demo 见B站视频中的串口单字节不定长双buffer的DMA和CPU并行工作Demo,环形缓冲+协议帧实战见老师,我们的串口dma加环形缓冲区主要是用于传输数据)





相关笔记